package leetcode_100;


/**
 *@author 周杨
 *RecoverBinarySearchTree_99 一个二叉搜索树有两个节点被交换了 修复这颗BST
 *describe:AC 26%
 *递归中序遍历二叉树，设置一个pre指针，记录当前节点中序遍历时的前节点，如果当前节点大于pre节点的值，说明需要调整次序。
	有一个技巧是如果遍历整个序列过程中只出现了一次次序错误，说明就是这两个相邻节点需要被交换。如果出现了两次次序错误，那就需要交换这两个节点。
 *2018年5月19日 下午4:06:27
 */
public class RecoverBinarySearchTree_99 {
	TreeNode mistake1, mistake2;;  
    TreeNode pre;
	static class TreeNode{
		int val;
		TreeNode left;
		TreeNode right;
		TreeNode(int x) { val = x; }
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	public void recoverTree(TreeNode root) {
		//pre必须设为null，通过遍历的时候设进去。因为是中序遍历，所以pre应该是深层叶子左子树的父节点。  
        recursive_traversal(root);  
        if(mistake1!=null&&mistake2!=null) {  
            int tmp = mistake1.val;  
            mistake1.val = mistake2.val;  
            mistake2.val = tmp;  
        }  
    }
	
	public void recursive_traversal(TreeNode root) {  
        if(root==null) {  
            return;  
        }  
        if(root.left!=null) {  
            recursive_traversal(root.left);  
        }  
        if(pre!=null&&root.val<pre.val) {  
            if(mistake1==null) {  
                mistake1 = pre;  
                mistake2 = root;  
            } else {  
                mistake2 = root;  
            }  
        }  
        pre = root;  
        if(root.right!=null) {  
            recursive_traversal(root.right);  
        }  
    }  
}
